`timescale 1ns / 1ps

module maxpool_layer
#(
    parameter N_IO      = 4,
    parameter N_CH      = 48,
    parameter N_COL     = 320,
    parameter BIT       = 8
)
(
    input   clk,
    input   rst,
    
    input   i_vld,
    output  i_rdy,
    input   [N_IO*BIT-1 : 0]      i_data,
    
    output  o_vld,
    input   o_rdy,
    output  [N_IO*BIT-1 : 0]      o_data
);

localparam WIDTH = N_IO * BIT;
localparam DEPTH_OUT = (N_COL / 2 + 2) * N_CH / N_IO;

wire m_rdy;
wire m_vld;
wire [WIDTH-1 : 0] m_data;

// maxpool2x2 #(
//     .N_IO          ( N_IO          ),
//     .N_CH          ( N_CH          ),
//     .N_COL         ( N_COL         ),
//     .BIT           ( BIT           ),
//     .FIFOA_TYPE    ( "distributed" ),
//     .FIFOA_LATENCY ( 1             ),
//     .FIFOB_TYPE    ( "block"       ),
//     .FIFOB_LATENCY ( 2             )
// )
// inst_maxpool (
//     .clk                     ( clk      ),
//     .rst                     ( rst      ),

//     .i_rdy                   ( i_rdy    ),
//     .i_vld                   ( i_vld    ),
//     .i_data                  ( i_data   ),

//     .o_rdy                   ( m_rdy    ),
//     .o_vld                   ( m_vld    ),
//     .o_data                  ( m_data   )
// );

max2pool #(
    .N_IO          ( N_IO          ),
    .N_CH          ( N_CH          ),
    .N_COL         ( N_COL         ),
    .BIT           ( BIT           ),
    .RAM_TYPE      ( "block"       ),
    .RAM_LATENCY   ( 2             )
)
inst_maxpool (
    .clk                     ( clk      ),
    .rst                     ( rst      ),

    .i_rdy                   ( i_rdy    ),
    .i_vld                   ( i_vld    ),
    .i_data                  ( i_data   ),

    .o_rdy                   ( m_rdy    ),
    .o_vld                   ( m_vld    ),
    .o_data                  ( m_data   )
);

zq_fifo #(
    .WIDTH      ( WIDTH             ),
    .DEPTH      ( DEPTH_OUT         ),
    .RAMTYPE    ( "block"           ),
    .RAMLATENCY ( 2                 )
)
inst_fifo_out (
    .clk                     ( clk      ),
    .rst                     ( rst      ),

    .in_rdy                  ( m_rdy    ),
    .in_vld                  ( m_vld    ),
    .din                     ( m_data   ),

    .out_vld                 ( o_vld    ),
    .out_rdy                 ( o_rdy    ),
    .dout                    ( o_data   )
);

endmodule
